package org.example.yunshu.demos.file;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.ObjectMetadata;
import org.example.yunshu.demos.constant.Constants;
import org.example.yunshu.demos.mapper.UserMapper;
import org.example.yunshu.demos.model.Result;
import org.example.yunshu.demos.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@RestController
public class AvatarController {

    @Autowired
    private UserMapper userMapper ;

    @Autowired
    private OSS ossClient;  // 注入 OSS 客户端

    @Value("${oss.bucketName}")
    private String bucketName;

    @Value("${oss.domain}")
    private String ossDomain;

    /**
     * 头像上传接口
     * @param file 前端上传的图片文件（对应 FormData 中的 "avatarFile"）
     * @return 上传结果（包含 OSS 文件 URL）
     */
    @PostMapping("/api/upload/avatar")
    public Result uploadAvatar(@RequestParam("avatarFile") MultipartFile file
            , @RequestParam("userId")String userId,
                               HttpSession httpSession) {
        // 1. 校验文件是否为空
        if (file.isEmpty()) {
            return Result.error("文件为空，请选择图片");
        }

        // 2. 校验文件类型（仅允许图片）
        String contentType = file.getContentType();
        if (!contentType.startsWith("image/")) {
            return Result.error("仅支持图片文件（jpg/png/gif等）");
        }

        try {
            // 3. 生成 OSS 存储路径（避免文件名重复）
            String originalFileName = file.getOriginalFilename();
            String fileSuffix = originalFileName.substring(originalFileName.lastIndexOf(".")); // 获取文件后缀（如 .jpg）
            String ossFileName = "yunshu/" + userId + fileSuffix;  // OSS 存储路径（例如：avatar/123e4567.jpg）

            // 4. 设置文件元信息（可选，但推荐）
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setObjectAcl(CannedAccessControlList.PublicRead);
            metadata.setContentType(contentType);  // 设置文件类型（如 image/jpeg）
            metadata.setContentDisposition("inline;filename=" + originalFileName); // 浏览器访问时直接预览而非下载

            // 5. 上传文件到 OSS
            InputStream inputStream = file.getInputStream();
            ossClient.putObject(bucketName, ossFileName, inputStream, metadata);

            // 6. 生成 OSS 文件访问 URL（格式：https://{bucketName}.{endpoint}/{ossFileName}）
            String ossFileUrl = ossDomain + "/" + ossFileName;
            UserInfo userInfo = (UserInfo) httpSession.getAttribute(Constants.USERINFO_KEY);
            userInfo.setHeadImage(ossFileUrl);
             // 保存到数据库
            userMapper.updateHead(ossFileUrl,userId) ;


            return Result.success( ossFileUrl);

        } catch (IOException e) {
            e.printStackTrace();
            return Result.error("文件上传失败：" + e.getMessage());
        }


    }
}